package cn.enjoy.socket.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * @author K
 * @date 2024-06-04 20:32
 * TCP服务端（先启动服务端）
 **/
public class TCPDemoService {
    public static void main(String[] args) {
        try {
            //TCP服务端(监听10086端口，等待客户端发送数据到这个端口)
            ServerSocket serverSocket = new ServerSocket(10086);
            while (true){
                //接收消息
                Socket accept = serverSocket.accept();

                //服务的获取流，并接收数据（客户端传的是文本）
                System.out.println("开始接收数据！");
                BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
                String str = "";
                while ((str = br.readLine()) != null) {
                    System.out.println("打印数据：" + str);
                }
                //告知客户端，服务端接收数据完成
                accept.shutdownInput();
//                System.out.println("数据接收完成，准备断开连接");

                //发送数据告知客户端，服务端已经处理本次消息
                OutputStream outputStream = accept.getOutputStream();
                byte[] bytes = "服务器处理完成".getBytes(StandardCharsets.UTF_8);
                outputStream.write(bytes, 0, bytes.length);
                //告知客户端，服务端写出的数据完成(注：不这么写会报：java.net.SocketException: Connection reset)
                //因为客户端会一直读服务端返回的数据，此时没有这个方法，则服务端执行close直接关闭了，那么客户端执
                //行inputStream.read()就会出现问题，因为服务端都关闭了，你们客户端执行read方法肯定报错
                accept.shutdownOutput();

                //关闭Socket连接
//            serverSocket.close();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}